//
// This software is now distributed according to
// the Lesser Gnu Public License. Please see
// http://www.gnu.org/copyleft/lesser.txt for
// the details.
// -- Happy Computing!
//
package com.stevesoft.pat;

import java.util.Hashtable;

/** Implements the parenthesis pattern subelement. */
class OrMark extends Or {

	SubMark sm = new SubMark();
	int id;

	OrMark(int i) {
		sm.om = this;
		id = i;
	}

	String leftForm() {
		return "(";
	}

	public Pattern getNext() {
		return sm;
	}

	public int matchInternal(int pos, Pthings pt) {
		sm.next = super.getNext();
		if (pt.marks == null) {
			int n2 = 2 * pt.nMarks + 2;
			pt.marks = new int[n2];
			for (int i = 0; i < n2; i++)
				pt.marks[i] = -1;
		}
		pt.marks[id] = pos;
		int ret = super.matchInternal(pos, pt);
		if (ret < 0)
			pt.marks[id] = -1;
		else if (pt.marks[id] > pt.marks[id + pt.nMarks]) {
			int swap = pt.marks[id];
			pt.marks[id] = pt.marks[id + pt.nMarks] + 1;
			pt.marks[id + pt.nMarks] = swap + 1;
		}
		return ret;
	}

	public Pattern clone1(Hashtable h) {
		OrMark om = new OrMark(id);
		h.put(om, om);
		h.put(this, om);
		for (int i = 0; i < v.size(); i++)
			om.v.addElement(((Pattern) v.elementAt(i)).clone(h));
		return om;
	}
};
